home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-10-15 | 9.1 KB | 371 lines | [TEXT/PJMM] |
- UNIT StdScroll;
- {***********************************}
- INTERFACE
-
- USES
- MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, MacPrint, ObjIntf, GlobalStuff, MyDocuments;
-
- TYPE
- TScrollBar = OBJECT(TObject)
- fCtlHdl: ControlHandle;
- oDocument: TDocument;
- FUNCTION ScrollMax (vBar, vMargin: Integer): Integer;
- PROCEDURE DoNew (vBar: Integer;
- vWPtr: WindowPtr;
- vRect: Rect);
- PROCEDURE ClickInSBar (vCtlItem: Integer;
- vPt: Point);
- PROCEDURE SetupAutoScroll (vSBars: Integer);
- PROCEDURE Adjust;
- PROCEDURE ReDraw (vRect: Rect);
- PROCEDURE Activate;
- END;
-
- PROCEDURE InitAutoScroll (oDoc: TDocument);
-
- {***********************************}
- IMPLEMENTATION
-
- VAR
- uHHdl: ControlHandle;
- uVHdl: ControlHandle;
- uSBars: Integer;
- oDoc: TDocument;
- uScrollDelay, uDelay: LongInt;
-
- {========================================}
- FUNCTION TScrollBar.ScrollMax (vBar, vMargin: Integer): Integer;
- VAR
- vDocWidth: Integer;
- vDocHeight: Integer;
- vMax: Integer;
-
- BEGIN
- WITH oDocument.fDocRect DO
- BEGIN
- vDocWidth := right - left;
- vDocHeight := bottom - top;
- END;
- vMax := 0;
- WITH oDocument.fViewRect DO
- CASE vBar OF
- kHBar:
- vMax := vDocWidth - (right - left) + vMargin;
- kVBar:
- vMax := vDocHeight - (bottom - top) + vMargin;
- END;
- IF vMax < 0 THEN
- vMax := 0;
- ScrollMax := vMax;
- END; {ScrollMax}
-
- {----------------------------------------}
- PROCEDURE TScrollBar.DoNew (vBar: Integer;
- vWPtr: WindowPtr;
- vRect: Rect);
- VAR
- vTitle: Str255;
- vVisible: BOOLEAN;
- vCtlValue: Integer;
- vCtlMin: Integer;
- vCtlMax: Integer;
- vProcID: Integer;
- vRefVal: longint;
-
- BEGIN
- vTitle := '';
- vVisible := TRUE;
- vCtlValue := 0;
- vCtlMin := 0;
- vCtlMax := ScrollMax(vBar, 0);
- vProcID := scrollBarProc;
- vRefVal := vBar;
- fCtlHdl := NewControl(vWPtr, vRect, vTitle, vVisible, vCtlValue, vCtlMin, vCtlMax, vProcID, vRefVal);
- END; {DoNew}
-
- {----------------------------------------}
- PROCEDURE ScrollContent (vCtlHdl: ControlHandle);
- VAR
- vCtlValue: Integer;
- vDocRect: Rect;
- vDeltaH, vDeltaV: Integer;
- vUpdateRgn: RgnHandle;
-
- BEGIN
- HLock(Handle(oDoc));
- WITH oDoc DO
- BEGIN
- vCtlValue := GetCtlValue(vCtlHdl);
- SetClip(fViewRgn);
- vDeltaH := 0;
- vDeltaV := 0;
- vUpdateRgn := NewRgn;
- CASE GetCRefCon(vCtlHdl) OF
- kHBar:
- vDeltaH := fViewRect.left - fDocRect.left - vCtlValue;
- kVBar:
- vDeltaV := fViewRect.top - fDocRect.top - vCtlValue;
- END;
- vDocRect := fDocRect;
- OffsetRect(vDocRect, vDeltaH, vDeltaV);
- fDocRect := vDocRect;
- ScrollRect(fViewRect, vDeltaH, vDeltaV, vUpdateRgn);
- SetClip(vUpdateRgn);
- Update;
- ClipRect(thePort^.portRect);
- DisposeRgn(vUpdateRgn);
- END;
- HUnlock(Handle(oDoc));
- END; {ScrollContent}
-
- {- - - - - - - - - - - - - - - - - - -}
- PROCEDURE DoScroll (vCtlHdl: ControlHandle;
- vPart: Integer);
- VAR
- vCtlValue: Integer;
- vCtlMax: Integer;
- vCtlMin: Integer;
- vSize: Integer;
- vPageSize: Integer;
- vAmount: Integer;
-
- BEGIN
- vCtlValue := GetCtlValue(vCtlHdl);
- vCtlMax := GetCtlMax(vCtlHdl);
- vCtlMin := GetCtlMin(vCtlHdl);
- vAmount := 0;
- IF oDoc.fDocType = kTextDoc THEN
- vSize := oDoc.fTextHdl^^.lineHeight
- ELSE
- vSize := 5;
-
- WITH oDoc.fViewRect DO
- CASE GetCRefCon(vCtlHdl) OF
- kHBar:
- vPageSize := (right - left) DIV 2;
- kVBar:
- vPageSize := ((bottom - top) DIV vSize - 1) * vSize
- END;
-
- CASE vPart OF
- inUpButton:
- IF vCtlValue > vCtlMin THEN
- vAmount := -vSize;
- inDownButton:
- IF vCtlValue < vCtlMax THEN
- vAmount := +vSize;
- inPageUp:
- IF vCtlValue > vCtlMin THEN
- vAmount := -vPageSize;
- inPageDown:
- IF vCtlValue < vCtlMax THEN
- vAmount := +vPageSize;
- OTHERWISE
- END;
- IF vAmount <> 0 THEN
- BEGIN
- SetCtlValue(vCtlHdl, vCtlValue + vAmount);
- ScrollContent(vCtlHdl);
- IF uScrollDelay > 0 THEN
- uScrollDelay := uScrollDelay - 5
- ELSE
- uScrollDelay := 0;
- Delay(uScrollDelay, uDelay);
- END;
- END; {DoScroll}
-
- {- - - - - - - - - - - - - - - - - - -}
- PROCEDURE TScrollBar.ClickInSBar (vCtlItem: Integer;
- vPt: Point);
- BEGIN
- oDoc := self.oDocument;
- CASE vCtlItem OF
- inUpButton..inPageDown:
- BEGIN
- uScrollDelay := kScrollDelay;
- vCtlItem := TrackControl(fCtlHdl, vPt, @DoScroll);
- END;
- inThumb:
- BEGIN
- vCtlItem := TrackControl(fCtlHdl, vPt, NIL);
- ScrollContent(fCtlHdl);
- END;
- END;
- END; {ClickInSBar}
-
- {----------------------------------------}
- FUNCTION DoAutoScroll: BOOLEAN;
- VAR
- vOldClip: RgnHandle;
- vPt: Point;
- vViewRect: Rect;
-
- BEGIN
- vOldClip := NewRgn;
- GetClip(vOldClip);
- ClipRect(thePort^.portRect);
- GetMouse(vPt);
- vViewRect := oDoc.fViewRgn^^.rgnBBox;
- IF uSBars IN [kHScroll, kScroll, kHScrollZoom, kScrollZoom] THEN
- IF vPt.h < vViewRect.left THEN
- DoScroll(uHHdl, InUpButton)
- ELSE IF vPt.h > vViewRect.right THEN
- DoScroll(uHHdl, InDownButton);
- IF uSBars IN [kVScroll, kScroll, kVScrollZoom, kScrollZoom] THEN
- IF vPt.v < vViewRect.top THEN
- DoScroll(uVHdl, InUpButton)
- ELSE IF vPt.v > vViewRect.bottom THEN
- DoScroll(uVHdl, InDownButton);
- SetClip(vOldClip);
- DisposeRgn(vOldClip);
- DoAutoScroll := TRUE;
- END; {DoAutoScroll}
-
- {----------------------------------------}
- PROCEDURE InitAutoScroll (oDoc: TDocument);
- BEGIN
- IF oDoc.fDocType = kTextDoc THEN
- SetClikLoop(@DoAutoScroll, oDoc.fTextHdl)
- ELSE IF oDoc.fDocType = kPictDoc THEN
- ; {Install Autoscroll for graphics}
- END; {InitAutoScroll}
-
- {----------------------------------------}
- PROCEDURE TScrollBar.SetupAutoScroll (vSBars: Integer);
- BEGIN
- oDoc := self.oDocument;
- uSBars := vSBars;
- uScrollDelay := 0;
- CASE GetCRefCon(fCtlHdl) OF
- kHBar:
- uHHdl := fCtlHdl;
- kVBar:
- uVHdl := fCtlHdl;
- END;
- IF vSBars IN [kHScroll, kHScrollZoom] THEN
- uVHdl := NIL;
- IF vSBars IN [kVScroll, kVScrollZoom] THEN
- uHHdl := NIL;
- END; {SetupAutoScroll}
-
- {----------------------------------------}
- FUNCTION AdjustToCR (vTextHdl: TEHandle): Integer;
- VAR
- vCharHdl: CharsHandle;
-
- BEGIN
- WITH vTextHdl^^ DO
- BEGIN
- AdjustToCR := 0;
- vCharHdl := CharsHandle(hText);
- IF teLength > 0 THEN
- IF vCharHdl^^[teLength - 1] = Chr(kCR) THEN
- AdjustToCR := lineHeight;
- END;
- END; {AdjustToCR}
-
- {- - - - - - - - - - - - - - - - - - -}
- PROCEDURE TScrollBar.Adjust;
- VAR
- vViewWidth: Integer;
- vViewHeight: Integer;
- vCtlValue: Integer;
- vCtlMax: Integer;
- vScrollFlag: BOOLEAN;
-
- BEGIN
- oDoc := self.oDocument;
- WITH oDocument DO
- IF fDocType = kTextDoc THEN
- BEGIN
- WITH fViewRect DO
- BEGIN
- vViewWidth := (right - left) - kTextMargin;
- vViewHeight := (bottom - top);
- END;
- WITH fTextHdl^^.selRect DO
- CASE GetCRefCon(fCtlHdl) OF
- kHBar:
- BEGIN
- vCtlMax := self.ScrollMax(kHBar, 0);
- SetCtlMax(fCtlHdl, vCtlMax);
- vScrollFlag := (left < fViewRect.left) OR (right > fViewRect.right);
- IF vScrollFlag THEN
- BEGIN
- IF left < -20000 THEN
- left := -20000;
- vCtlValue := left - fDocRect.left - vViewWidth;
- SetCtlValue(fCtlHdl, vCtlValue);
- ScrollContent(fCtlHdl);
- END;
- END;
- kVBar:
- BEGIN
- vCtlMax := self.ScrollMax(kVBar, AdjustToCR(fTextHdl));
- SetCtlMax(fCtlHdl, vCtlMax);
- vScrollFlag := (top < fViewRect.top) OR (bottom > fViewRect.bottom);
- vScrollFlag := vScrollFlag OR (fDocRect.bottom < fViewRect.bottom);
- IF vScrollFlag THEN
- BEGIN
- vCtlValue := bottom - fDocRect.top - vViewHeight;
- SetCtlValue(fCtlHdl, vCtlValue);
- ScrollContent(fCtlHdl);
- END;
- END;
- END;
- END
- ELSE IF fDocType = kPictDoc THEN
- ; {Code for graphics}
- END; {Adjust}
-
- {----------------------------------------}
- PROCEDURE TScrollBar.ReDraw (vRect: Rect);
- VAR
- vDelta: Integer;
- vDocRect: Rect;
-
- BEGIN
- HideControl(fCtlHdl);
- WITH vRect, oDocument DO
- CASE GetCRefCon(fCtlHdl) OF
- kHBar:
- BEGIN
- MoveControl(fCtlHdl, left, top);
- SizeControl(fCtlHdl, right, bottom);
- SetCtlMax(fCtlHdl, ScrollMax(kHBar, 0));
- vDelta := GetCtlMax(fCtlHdl) + fDocRect.left - fViewRect.left;
- IF vDelta < 0 THEN
- BEGIN
- vDocRect := fDocRect;
- OffsetRect(vDocRect, -vDelta, 0);
- fDocRect := vDocRect;
- END;
- END;
- kVBar:
- BEGIN
- MoveControl(fCtlHdl, left, top);
- SizeControl(fCtlHdl, right, bottom);
- SetCtlMax(fCtlHdl, ScrollMax(kVBar, 0));
- vDelta := GetCtlMax(fCtlHdl) + fDocRect.top - fViewRect.top;
- IF vDelta < 0 THEN
- BEGIN
- vDocRect := fDocRect;
- OffsetRect(vDocRect, 0, -vDelta);
- fDocRect := vDocRect;
- END;
- END;
- END;
- ShowControl(fCtlHdl);
- END; {ReDraw}
-
- {----------------------------------------}
- PROCEDURE TScrollBar.Activate;
- BEGIN
- IF BitAnd(gEvent.modifiers, activeFlag) <> 0 THEN
- HiliteControl(fCtlHdl, 0)
- ELSE
- HiliteControl(fCtlHdl, 255);
- END; {Activate}
-
- END. {unit StdScroll}
- {***********************************}